#ifndef REDIS_H
#define REDIS_H

#include <hiredis/hiredis.h>
#include <thread>
#include <string>
#include <functional>
using namespace std;

/**
 * redis 作为集群服务器通信的基于发布-订阅消息队列时，会碰到两个难搞的bug
 * 
*/

class Redis
{
public:
    Redis();
    ~Redis();

    // 连接 redis 服务器
    bool connect();

    // 向 redis 指定的通道 channel 发布消息
    bool publish(int channel, string messages);

    // 向 redis 指定的通道 subscribe 订阅消息
    bool subscribe(int channel);

    // 向 redis 指定的通道 unsubscribe 取消订阅消息
    bool unsubscribe(int channel);

    // 在独立的线程中接收订阅通道中的消息
    void observer_channel_message();

    // 初始化向业务层上报通道消息的回调对象
    void init_notify_handler(function<void(int, string)> fn);

private:
    // hiredis 同步上下文对象，负责 publish 消息
    redisContext *_publish_context;

    // hiredis 同步上下文对象，负责 subscribe 消息
    redisContext *_subscribe_context;

    // 回调操作，收到订阅消息，给 service 层上报
    function<void(int, string)> _notify_message_handler;
};

#endif